Chyba v pouziti exportovane funkce z DLL
Otázka od: David Kopecek
14. 11. 2003 9:39
Zdravim delphare
mam aplikaci ktera si natahne DLL a zavola funkcni uvnitr one DLL, ale mam tam
jednu funkci ktera ma navracet data a nejak mi to stale pri zavolani pada.
tu dll mam naprogramovanou takto
uses
Sysutils, Windows,classes;
function GetDomainSMTPConfig(strDomain : pchar): Pchar; stdcall;
exports
GetDomainSMTPConfig;
implementation
function GetDomainSMTPConfig(strDomain : pchar): PChar; stdcall;
begin
GetDomainSMTPConfig:=Pchar(':::');
end;
end.
samotne pripojeni na onou DLL v aplikaci provadim takto:
kdyz vsak zavolam
strString := _GetDomainSMTPConfig("idnes.cz"); tak mi to zhavaruje s chybou..
pokud onou hodnotu co mi to ma navratit narvu do Pchar tak je to vpohode ale
stejnak stem
datama v pchar nemuzu pracovat protoze to zase padne. Kdyz navracim boolean tak
to pres tu
dll jede v pohode ale jakmile chci nejaky data tak nic.. nevite nekdo v cem by
mohl byt problem ?
type
TGetDomainSMTPConfig = function(strDomain : pchar): PChar; stdcall;
var
GetDomainSMTPConfig:TGetDomainSMTPConfig;
Function _GetDomainSMTPConfig(strDomain : pchar): Pchar;
implementation
Function _GetDomainSMTPConfig(strDomain:Pchar):Pchar;
var
hDllInst: THandle;
begin
result:='';
hDllInst := LoadLibrary('SDP.dll');
if hDllInst <= 0 then
Raise Exception.Create('[LoadLibrary Fail] GetLastError reports: '+
IntToStr(GetLastError));
try
@GetDomainSMTPConfig := GetProcAddress(hDllInst,'GetDomainSMTPConfig');
if not Assigned(GetDomainSMTPConfig) then
Raise Exception.Create('[GetProcAddress Fail] GetLastError reports: '+
IntToStr(GetLastError));
result:=GetDomainSMTPConfig(strDomain);
finally
FreeLibrary(hDllInst);
end;
end;
end.
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Petr Brant
14. 11. 2003 10:09
Videl bych to patrne na nealokovanou pamet. Mas nekde napsano
var strDomain: array[0..255] of char resp. neco podobneho? Nemam bohuzel cas
tvuj kod prilis zkoumat, takze sorry, pokud jsem to prehledl. Druha vec:
Nepovazuji za stastne, kdyz funkce vraci PChar. Vraci pointer na retezec,
otazkou je, kdo ma retezec alokovat. Cesta ven: misto funkce pouzit
proceduru napr. s hlavickou
procedure GetDomainSMTPConfig(strDomain : pchar; Vysledek: PChar);
//je zbytecne psat var Vysledek: PChar
a predavat do ni ukazatele na JIZ ALOKOVANOU pamet (DULEZITE !!!). Takze
napriklad
var strDomain, Vysledek: array[0..255] of char;
begin
strDomain:= ....
GetDomainSMTPConfig(strDomain, Vysledek);
....a tady uz muzes s vysledkem pracovat...
Zdravim a preji uspech
RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant
D&COMM s.r.o.
Korunovacni 6
Praha 7
tel. +420724007234
mam aplikaci ktera si natahne DLL a zavola funkcni uvnitr one DLL,
ale mam tam
jednu funkci ktera ma navracet data a nejak mi to stale pri zavolani
pada.
tu dll mam naprogramovanou takto
uses
Sysutils, Windows,classes;
function GetDomainSMTPConfig(strDomain : pchar): Pchar; stdcall;
exports
GetDomainSMTPConfig;
implementation
function GetDomainSMTPConfig(strDomain : pchar): PChar; stdcall;
begin
GetDomainSMTPConfig:=Pchar(':::');
end;
end.
samotne pripojeni na onou DLL v aplikaci provadim takto:
kdyz vsak zavolam
strString := _GetDomainSMTPConfig("idnes.cz"); tak mi to zhavaruje s
chybou..
pokud onou hodnotu co mi to ma navratit narvu do Pchar tak je to
vpohode ale stejnak stem
datama v pchar nemuzu pracovat protoze to zase padne. Kdyz navracim
boolean tak to pres tu
dll jede v pohode ale jakmile chci nejaky data tak nic.. nevite
nekdo v cem by mohl byt problem ?
type
TGetDomainSMTPConfig = function(strDomain : pchar): PChar;
stdcall;
var
GetDomainSMTPConfig:TGetDomainSMTPConfig;
Function _GetDomainSMTPConfig(strDomain : pchar): Pchar;
implementation
Function _GetDomainSMTPConfig(strDomain:Pchar):Pchar;
var
hDllInst: THandle;
begin
result:='';
hDllInst := LoadLibrary('SDP.dll');
if hDllInst <= 0 then
Raise Exception.Create('[LoadLibrary Fail] GetLastError reports:
'+
IntToStr(GetLastError));
try
@GetDomainSMTPConfig :=
GetProcAddress(hDllInst,'GetDomainSMTPConfig');
if not Assigned(GetDomainSMTPConfig) then
Raise Exception.Create('[GetProcAddress Fail] GetLastError
reports: '+
IntToStr(GetLastError));
result:=GetDomainSMTPConfig(strDomain);
finally
FreeLibrary(hDllInst);
end;
end;
end.
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Rostislav Lekes
14. 11. 2003 11:58
Cau, s timhle jsem bojoval hodne dlouho a nakonec jsem to zprovoznil.
Problem je ve sdileni pameti mezi aplikaci a knihovnou (viz help).
Zkusil jsem to obslehnout z nejakych prikladu a metodou pokus omyl jsem to
privedl do tohoto stavu. Proc to ale takto funguje a jinak ne, to opravdu
nevim
Snad z toho neco vyctes. Ciste reseni to asi moc neni, v helpu doporucuji
pouzit nejakou unitu (nebo knihovnu) na sdileni pameti, ale to jsem
nezkousel, resp.jenom chvilku a nerozchodil jsem to ....
Rosta
library DatamaxIClass;
uses
SysUtils,
Classes;
{$R *.RES}
Function ZpracujVstupenku(TiskParam:TStringList):PChar;
var
TiskRetez : String;
begin
TiskRetez:='.....';
Result := PChar(TiskRetez);
end;
Exports
ZpracujVstupenku;
begin
end.
z aplikace :
Type
TZpracujVstupenku = Function(TiskParam:TStringList):PChar;
var
ProTisk:String;
JmenoTiskarny:String; // jmeno dll
Knihovna : Integer;
ZpracujVstupenku : TZpracujVstupenku;
List : TStringList;
begin
******
Knihovna := LoadLibrary(PCHAR(JmenoTiskarny)); // Natahne prislusnou
knihovnu
@ZpracujVstupenku := GetProcAddress(Knihovna, 'ZpracujVstupenku');
ProTisk:= ZpracujVstupenku(List);
FreeLibrary(Knihovna);
******
end;
----- Original Message -----
From: "David Kopecek" <david.kopecek@hacktrack.com>
To: <delphi-l@clexpert.cz>
Sent: Friday, November 14, 2003 9:16 AM
Subject: Chyba v pouziti exportovane funkce z DLL
> Zdravim delphare
>
> mam aplikaci ktera si natahne DLL a zavola funkcni uvnitr one DLL, ale mam
tam
> jednu funkci ktera ma navracet data a nejak mi to stale pri zavolani pada.
>
> tu dll mam naprogramovanou takto
>
> uses
> Sysutils, Windows,classes;
>
> function GetDomainSMTPConfig(strDomain : pchar): Pchar; stdcall;
>
> exports
> GetDomainSMTPConfig;
>
> implementation
>
> function GetDomainSMTPConfig(strDomain : pchar): PChar; stdcall;
> begin
> GetDomainSMTPConfig:=Pchar(':::');
> end;
>
> end.
>
> samotne pripojeni na onou DLL v aplikaci provadim takto:
> kdyz vsak zavolam
>
> strString := _GetDomainSMTPConfig("idnes.cz"); tak mi to zhavaruje s
chybou..
> pokud onou hodnotu co mi to ma navratit narvu do Pchar tak je to vpohode
ale stejnak stem
> datama v pchar nemuzu pracovat protoze to zase padne. Kdyz navracim
boolean tak to pres tu
> dll jede v pohode ale jakmile chci nejaky data tak nic.. nevite nekdo v
cem by mohl byt problem ?
>
>
> type
> TGetDomainSMTPConfig = function(strDomain : pchar): PChar; stdcall;
>
> var
> GetDomainSMTPConfig:TGetDomainSMTPConfig;
>
> Function _GetDomainSMTPConfig(strDomain : pchar): Pchar;
>
> implementation
>
> Function _GetDomainSMTPConfig(strDomain:Pchar):Pchar;
> var
> hDllInst: THandle;
> begin
> result:='';
> hDllInst := LoadLibrary('SDP.dll');
> if hDllInst <= 0 then
> Raise Exception.Create('[LoadLibrary Fail] GetLastError reports: '+
> IntToStr(GetLastError));
> try
> @GetDomainSMTPConfig :=
GetProcAddress(hDllInst,'GetDomainSMTPConfig');
> if not Assigned(GetDomainSMTPConfig) then
> Raise Exception.Create('[GetProcAddress Fail] GetLastError reports:
'+
> IntToStr(GetLastError));
>
> result:=GetDomainSMTPConfig(strDomain);
>
> finally
> FreeLibrary(hDllInst);
> end;
>
> end;
> end.
>
>
>
>
>
>
>
>
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Vymazal Milan
14. 11. 2003 11:51
Cau
> Cau, s timhle jsem bojoval hodne dlouho a nakonec jsem to zprovoznil.
> Problem je ve sdileni pameti mezi aplikaci a knihovnou (viz help).
> Zkusil jsem to obslehnout z nejakych prikladu a metodou pokus omyl jsem to
> privedl do tohoto stavu. Proc to ale takto funguje a jinak ne, to opravdu
> nevim
> Snad z toho neco vyctes. Ciste reseni to asi moc neni, v helpu doporucuji
> pouzit nejakou unitu (nebo knihovnu) na sdileni pameti, ale to jsem
> nezkousel, resp.jenom chvilku a nerozchodil jsem to ....
> Rosta
No jenze i tak to mam presne ja a nefunguje to
> library DatamaxIClass;
> uses
> SysUtils,
> Classes;
> {$R *.RES}
> Function ZpracujVstupenku(TiskParam:TStringList):PChar;
> var
> TiskRetez : String;
> begin
> TiskRetez:='.....';
> Result := PChar(TiskRetez);
> end;
> Exports
> ZpracujVstupenku;
> begin
> end.
> z aplikace :
> Type
> TZpracujVstupenku = Function(TiskParam:TStringList):PChar;
> var
> ProTisk:String;
> JmenoTiskarny:String; // jmeno dll
> Knihovna : Integer;
> ZpracujVstupenku : TZpracujVstupenku;
> List : TStringList;
> begin
> ******
> Knihovna := LoadLibrary(PCHAR(JmenoTiskarny)); // Natahne prislusnou
> knihovnu
> @ZpracujVstupenku := GetProcAddress(Knihovna, 'ZpracujVstupenku');
> ProTisk:= ZpracujVstupenku(List);
> FreeLibrary(Knihovna);
> ******
> end;
> ----- Original Message -----
> From: "David Kopecek" <david.kopecek@hacktrack.com>
> To: <delphi-l@clexpert.cz>
> Sent: Friday, November 14, 2003 9:16 AM
> Subject: Chyba v pouziti exportovane funkce z DLL
>> Zdravim delphare
>>
>> mam aplikaci ktera si natahne DLL a zavola funkcni uvnitr one DLL, ale mam
> tam
>> jednu funkci ktera ma navracet data a nejak mi to stale pri zavolani pada.
>>
>> tu dll mam naprogramovanou takto
>>
>> uses
>> Sysutils, Windows,classes;
>>
>> function GetDomainSMTPConfig(strDomain : pchar): Pchar; stdcall;
>>
>> exports
>> GetDomainSMTPConfig;
>>
>> implementation
>>
>> function GetDomainSMTPConfig(strDomain : pchar): PChar; stdcall;
>> begin
>> GetDomainSMTPConfig:=Pchar(':::');
>> end;
>>
>> end.
>>
>> samotne pripojeni na onou DLL v aplikaci provadim takto:
>> kdyz vsak zavolam
>>
>> strString := _GetDomainSMTPConfig("idnes.cz"); tak mi to zhavaruje s
> chybou..
>> pokud onou hodnotu co mi to ma navratit narvu do Pchar tak je to vpohode
> ale stejnak stem
>> datama v pchar nemuzu pracovat protoze to zase padne. Kdyz navracim
> boolean tak to pres tu
>> dll jede v pohode ale jakmile chci nejaky data tak nic.. nevite nekdo v
> cem by mohl byt problem ?
>>
>>
>> type
>> TGetDomainSMTPConfig = function(strDomain : pchar): PChar; stdcall;
>>
>> var
>> GetDomainSMTPConfig:TGetDomainSMTPConfig;
>>
>> Function _GetDomainSMTPConfig(strDomain : pchar): Pchar;
>>
>> implementation
>>
>> Function _GetDomainSMTPConfig(strDomain:Pchar):Pchar;
>> var
>> hDllInst: THandle;
>> begin
>> result:='';
>> hDllInst := LoadLibrary('SDP.dll');
>> if hDllInst <= 0 then
>> Raise Exception.Create('[LoadLibrary Fail] GetLastError reports: '+
>> IntToStr(GetLastError));
>> try
>> @GetDomainSMTPConfig :=
> GetProcAddress(hDllInst,'GetDomainSMTPConfig');
>> if not Assigned(GetDomainSMTPConfig) then
>> Raise
Exception.Create('[GetProcAddress Fail] GetLastError reports:
> '+
>> IntToStr(GetLastError));
>>
>> result:=GetDomainSMTPConfig(strDomain);
>>
>> finally
>> FreeLibrary(hDllInst);
>> end;
>>
>> end;
>> end.
>>
>>
>>
>>
>>
>>
>>
>>
S pozdravem
Milan Vymazal
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Dalibor Toman
14. 11. 2003 12:13
David Kopecek <david.kopecek@hacktrack.com> wrote:
> Zdravim delphare
>
> uses
> Sysutils, Windows,classes;
>
> function GetDomainSMTPConfig(strDomain : pchar): Pchar; stdcall;
>
> exports
> GetDomainSMTPConfig;
>
> implementation
>
> function GetDomainSMTPConfig(strDomain : pchar): PChar; stdcall;
> begin
> GetDomainSMTPConfig:=Pchar(':::');
> end;
>
> end.
>
>
> type
> TGetDomainSMTPConfig = function(strDomain : pchar): PChar;
> stdcall;
>
> var
> GetDomainSMTPConfig:TGetDomainSMTPConfig;
>
> Function _GetDomainSMTPConfig(strDomain : pchar): Pchar;
>
> implementation
>
> Function _GetDomainSMTPConfig(strDomain:Pchar):Pchar;
> var
> hDllInst: THandle;
> begin
> result:='';
> hDllInst := LoadLibrary('SDP.dll');
> if hDllInst <= 0 then
> Raise
Exception.Create('[LoadLibrary Fail] GetLastError
> reports: '+
IntToStr(GetLastError));
> try
> @GetDomainSMTPConfig :=
> GetProcAddress(hDllInst,'GetDomainSMTPConfig'); if not
> Assigned(GetDomainSMTPConfig) then Raise
>
Exception.Create('[GetProcAddress
> Fail] GetLastError reports: '+
IntToStr(GetLastError));
>
> result:=GetDomainSMTPConfig(strDomain);
>
> finally
> FreeLibrary(hDllInst);
> end;
>
> end;
problem je ten, ze po FreeLibrary() ukazuje Result na pamet, ktera jiz
neexistuje.
Musis to udelat tak, ze do funkce zknihovny predas buffer alokovany v
aplikaci - napriklad takhle:
function GetDomainSMTPConfig(strDomain : pchar; ResultBuff : Pointer;
BuffSize : Integer): Boolean; stdcall;
ci nejak podobne.
Zdravi
Dalibor Toman
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Rostislav Lekes
14. 11. 2003 12:30
Nemas to presne , parametr fce mas PChar, ja tam posilam cely StringList,
takze v tvem pripade by to asi mel byt asi String. Me to zatim chodi bez
problemu.
> No jenze i tak to mam presne ja a nefunguje to
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)